# -*- coding: utf-8 -*-
"""
@time：  2021/06/16  21:01
@Auto：Mr. xingye  993843278
@Company 星野训练营 99384378@qq.com
@Function:接口测试关键字库

"""
import json
import traceback

import jsonpath
import requests

from common.Logger import logger


class Inter:

    def __init__(self):
        self.session = requests.session()
        self.test_result = ''
        self.json_result = {}
        #保存关联的参数
        self.relations = {}

    def seturl(self,url:str=None):
        """
        设置请求地址
        :param url:传入的url
        :return:
        """
        self.url = url
        return 0,self.url


    def post(self,name:str='',params:str=''):
        """
        完成post的请求发包
        :param name:接口名字
        :param params:参数
        :return:
        """
        #如果传的name地址不是http开头，需要拼接地址
        if not name.startswith('http'):
            name = self.url + '/' + name

        #如果是json传参
        if params.startswith('{'):
            params = json.loads(params)
        else:
            # 字符串参数需要处理为字典
            params = self.__get_data(params)

        try:
            result = self.session.post(name,data=params)
            #如果需要编码处理
            # self.test_result = result.content.decode('utf8')
            self.test_result = result.text
            try:
                self.json_result = json.loads(self.test_result)
                return 0,self.json_result
            except Exception as e:
                print('json处理异常')
                #让结果等于异常信息，方便排错
                self.test_result = str(traceback.format_exc())
                return 1, self.test_result


        except Exception as e:
            logger.error('请求异常')
            # 让结果等于异常信息，方便排错
            self.test_result = str(traceback.format_exc())
            self.json_result = {"error":'请求异常'}
            return 1,self.test_result

    def savejson(self,params_name:str='',jaonpath:str=''):
        """把前一次请求结果保存为全局变量"""
        try:
            self.relations[params_name] = str(jsonpath.jsonpath(self.json_result,jaonpath)[0])
            return 0,self.relations

        except Exception as e:
            logger.error('json中%s值提取失败'%params_name)
            logger.exception(e)
            return 1,logger.exception(e)



    def addheader(self,key:str='',value:str=''):
        """
        往session会话头里面添加一个键值对
        :param key:需要添加的键
        :param value:添加数据的键的值
        :return:无
        """
        value = self.__get_param(value)
        self.session.headers[key] = value

        return 0,self.session.headers

    def assertequals(self,key:str='',expect_result:str=''):
        """
        断言json_result中的result_key的值和expect_result相等
        :param result_key:键的json表达式
        :param expect_result:预取结果的值
        :return:
        """
        expect_result = self.__get_param(expect_result)

        res = str(jsonpath.jsonpath(self.json_result,key)[0])
        if res == str(expect_result):
            logger.info('PASS')
            self.resultlog = '%s与%s中的%s结果值相同' % (expect_result,self.test_result,key)
            return 0,self.resultlog
        else:
            logger.error('FAIL')
            logger.error("预期结果与实际结果不同")
            self.resultlog = '%s与%s中的%s结果值不同！！！' % (expect_result,self.test_result,key)
            return 1,self.resultlog

    # 计算处理的方法，将传入的value值作为s传入到__get_param方法中获取对应的值
    def __get_param(self,value:str=''):

        # 按规则获取关联的参数 意义的格式为{}的形式
        # 遍历保存的关联数据的字段
        for key in self.relations:
            value = value.replace('{' + key + '}',self.relations[key])
        return value


    def removeheader(self,key:str=''):
        """
        删除头
        :param key:要删除的键
        :return: 无
        """
        self.session.headers.pop(key)
        return 0,self.session.headers


    def __get_data(self,params:str):
        """
        把url格式的参数处理成字典
        :param params: 标准的data传参
        :return: 返回字典
        """
        if params:
            params_dict = {}
            params = params.split('&')
            for key_value in params:
                key = key_value[:key_value.find('=')]
                value = key_value[key_value.find('=')+1:]
                params_dict[key] = value

            return params_dict
        else:
            return None